package org.mspring.platform.support.sitemap;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;

/**
 * Encapsulates a single URL to be inserted into a Web sitemap (as opposed to a Geo sitemap, a Mobile sitemap, a Video sitemap, etc which are Google specific). Specifying a lastMod, changeFreq, or priority is optional; you specify those by using an Options object.
 *
 * @see Options
 * @author Dan Fabulich
 *
 */
public class WebSitemapUrl implements ISitemapUrl {
    private final URL url;
    private final Date lastMod;
    private final ChangeFreq changeFreq;
    private final Double priority;

    /** Encapsulates a single simple URL */
    public WebSitemapUrl(String url) throws MalformedURLException {
        this(new URL(url));
    }

    /** Encapsulates a single simple URL */
    public WebSitemapUrl(URL url) {
        this.url = url;
        this.lastMod = null;
        this.changeFreq = null;
        this.priority = null;
    }

    /** Creates an URL with configured options */
    public WebSitemapUrl(Options options) {
        this((AbstractSitemapUrlOptions<?, ?>) options);
    }

    WebSitemapUrl(AbstractSitemapUrlOptions<?, ?> options) {
        this.url = options.url;
        this.lastMod = options.lastMod;
        this.changeFreq = options.changeFreq;
        this.priority = options.priority;
    }

    /** Retrieves the {@link Options#lastMod(Date)} */
    @Override
    public Date getLastMod() {
        return lastMod;
    }

    /** Retrieves the {@link Options#changeFreq(ChangeFreq)} */
    public ChangeFreq getChangeFreq() {
        return changeFreq;
    }

    /** Retrieves the {@link Options#priority(Double)} */
    public Double getPriority() {
        return priority;
    }

    /** Retrieves the url */
    @Override
    public URL getUrl() {
        return url;
    }

    /** Options to configure web sitemap URLs */
    public static class Options extends AbstractSitemapUrlOptions<WebSitemapUrl, Options> {

        /** Configure this URL */
        public Options(String url) throws MalformedURLException {
            this(new URL(url));
        }

        /** Configure this URL */
        public Options(URL url) {
            super(url, WebSitemapUrl.class);
        }

    }
}
